import { userWxlogin } from "@/api/users";
import Vue from "vue";
import Vuex from "vuex";

// 以插件形式注册到 Vue 中
Vue.use(Vuex);

// 创建 Store 实例
const store = new Vuex.Store({
  state: {
    // 用户信息
    userProfile: uni.getStorageSync("userProfile") || {},
    // 初始化购物车数据
    cartList: uni.getStorageSync("cartList") || [],
  },
  // 计算
  getters: {
    // 计算全选状态
    isSelectAll(state, getters) {
      // every 方法测试一个数组内的所有元素是否都能通过某个指定函数的测试。它返回一个布尔值。
      return state.cartList.every((v) => v.goods_select);
    },
    // 计算选中列表 - 过滤出选中的
    selectCartList(state) {
      return state.cartList.filter((v) => v.goods_select);
    },
    // 基于 getters 的选中列表，再计算选中的总钱数
    // 🎯 访问其他 getters 可以传入第二个形参
    selectCartListPrice(state, getters) {
      let sum = 0;
      getters.selectCartList.forEach((item) => {
        // 累加 单价 * 数量
        sum += item.goods_price * item.goods_count;
      });
      // 记得返回计算结果
      return sum;
    },
    // 基于 getters 的选中列表，再计算选中的总件数
    selectCartListCount(state, getters) {
      let sum = 0;
      getters.selectCartList.forEach((item) => {
        // 累加 数量
        sum += item.goods_count;
      });
      // 记得返回计算结果
      return sum;
    },
  },
  // 同步方法
  mutations: {
    setCartList(state, payload) {
      // 更新购物车数据
      state.cartList = payload;
      // 同步到本地存储(数据缓存)
      uni.setStorageSync("cartList", payload);
    },
    // 保存用户信息，包含 token
    setUserProfile(state, payload) {
      state.userProfile = payload;
      uni.setStorageSync("userProfile", payload);
    },
  },
  actions: {
    async userWxLogin(store) {
      // 提前说明：小程序后端登录的API，需要用专属的 appid 才可以实现，appid 在后端写死的
      // 1. 获取微信的登录信息
      //   1.1 获取用户信息- 获取到登录接口所需的 4 个用户信息参数
      const [userInfoError, userInfoRes] = await uni.getUserInfo();
      // console.log(userInfoRes);
      // console.log('userInfoError, userInfoRes', userInfoError, userInfoRes)
      const { signature, iv, encryptedData, rawData } = userInfoRes;
      //   1.2 获取登录验证码
      const [loginError, loginRes] = await uni.login();
      // console.log('loginError, loginRes', loginError, loginRes)
      const { code } = loginRes;
      //   1.3 收集后端所需的 5 个请求参数
      const data = {
        signature,
        iv,
        encryptedData,
        rawData,
        code,
      };
      console.log(data);
      // console.log('接口所需的5个请求参数', data)
      // 🎯注意事项：工作中，需要在公司的运营人员，把你的微信号添加到开发者列表中~
      const res = await userWxlogin(data);

      res.data.message = {
        user_id: 23,
        user_email_code: null,
        is_active: null,
        user_sex: "男",
        user_qq: "",
        user_tel: "",
        user_xueli: "本科",
        user_hobby: "",
        user_introduce: null,
        create_time: 1562221487,
        update_time: 1562221487,
        token:
          "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOjIzLCJpYXQiOjE1NjQ3MzAwNzksImV4cCI6MTAwMTU2NDczMDA3OH0.YPt-XeLnjV-_1ITaXGY2FhxmCe4NvXuRnRB8OMCfnPo",
      };
      // 接口有可能返回 null，直接退出
      if (!res.data.message) {
        uni.showToast({
          title: "登录失败，请重试~",
          icon: "none",
        });
        return;
      }
      // 全局状态管理，因为其他的页面组件都也需要使用 token 和 用户信息
      store.commit("setUserProfile", res.data.message);
      const { token } = res.data.message;
      console.log("token", token);
    },
  },
});

// 默认导出
export default store;
